home *** CD-ROM | disk | FTP | other *** search
/ Supercompiler 1997 / SUPERCOMPILER97.iso / Delphi 3.0 / DATA.Z / provider.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1997-01-29  |  5.6 KB  |  217 lines

  1.  
  2. {*******************************************************}
  3. {                                                       }
  4. {       Delphi Visual Component Library                 }
  5. {       Custom Provider                                 }
  6. {                                                       }
  7. {       Copyright (c) 1997 Borland International        }
  8. {                                                       }
  9. {*******************************************************}
  10.  
  11. unit Provider;
  12.  
  13. interface
  14.  
  15. uses Windows, ActiveX, SysUtils, ComObj, Classes, StdVcl;
  16.  
  17. type
  18.  
  19. { TCustomProvider }
  20.  
  21.   TCustomProvider = class;
  22.  
  23.   TProviderObject = class(TAutoIntfObject, IProvider)
  24.   private
  25.     FProvider: TCustomProvider;
  26.   protected
  27.     procedure CheckProvider;
  28.     { IProvider }
  29.     function Get_Data: OleVariant; safecall;
  30.     function GetMetaData: OleVariant; safecall;
  31.     function GetRecords(Count: Integer; out RecsOut: Integer): OleVariant; safecall;
  32.     function ApplyUpdates(Delta: OleVariant; MaxErrors: Integer; out ErrorCount: Integer): OleVariant; safecall;
  33.     function DataRequest(Input: OleVariant): OleVariant; safecall;
  34.     function Get_Constraints: WordBool; safecall;
  35.     procedure Set_Constraints(Value: WordBool); safecall;
  36.     procedure Reset; safecall;
  37.   public
  38.     constructor Create(AProvider: TCustomProvider);
  39.     destructor Destroy; override;
  40.   end;
  41.  
  42.   TCustomProvider = class(TComponent)
  43.   private
  44.     FProviders: TList;
  45.     FConstraints: WordBool;
  46.     procedure AddProvider(AProvider: TProviderObject);
  47.     procedure RemoveProvider(AProvider: TProviderObject);
  48.   protected
  49.     function GetProvider: IProvider; virtual;
  50.     constructor Create(AOwner: TComponent); override;
  51.     destructor Destroy; override;
  52.     function Get_Data: OleVariant; virtual;
  53.     function GetMetaData: OleVariant; virtual;
  54.     function GetRecords(Count: Integer; out RecsOut: Integer): OleVariant; virtual;
  55.     function ApplyUpdates(Delta: OleVariant; MaxErrors: Integer;
  56.       out ErrorCount: Integer): OleVariant; virtual; abstract;
  57.     function DataRequest(Input: OleVariant): OleVariant; virtual;
  58.     procedure Reset; virtual;
  59.     property Data: OleVariant read Get_Data;
  60.     property Provider: IProvider read GetProvider;
  61.     property Constraints: WordBool read FConstraints write FConstraints;
  62.   end;
  63.  
  64. implementation
  65.  
  66. const
  67.   SProviderInvalid = 'Invalid provider. Provider was freed by the application server';
  68.  
  69. { TProviderObject }
  70.  
  71. constructor TProviderObject.Create(AProvider: TCustomProvider);
  72. var
  73.   StdVcl: ITypeLib;
  74. begin
  75.   OleCheck(LoadRegTypeLib(LIBID_STDVCL, 1, 0, 0, StdVcl));
  76.   inherited Create(StdVcl, IProvider);
  77.   FProvider := AProvider;
  78.   if Assigned(FProvider) then FProvider.AddProvider(Self);
  79. end;
  80.  
  81. destructor TProviderObject.Destroy;
  82. begin
  83.   if Assigned(FProvider) then FProvider.RemoveProvider(Self);
  84.   inherited Destroy;
  85. end;
  86.  
  87. procedure TProviderObject.CheckProvider;
  88. begin
  89.   if not Assigned(FProvider) then raise EOleError.Create(SProviderInvalid);
  90. end;
  91.  
  92. { TProviderObject.IProvider }
  93.  
  94. function TProviderObject.ApplyUpdates(Delta: OleVariant; MaxErrors: Integer;
  95.   out ErrorCount: Integer): OleVariant;
  96. begin
  97.   CheckProvider;
  98.   Result := FProvider.ApplyUpdates(Delta, MaxErrors, ErrorCount);
  99. end;
  100.  
  101. function TProviderObject.Get_Data: OleVariant;
  102. begin
  103.   CheckProvider;
  104.   Result := FProvider.Get_Data;
  105. end;
  106.  
  107. function TProviderObject.GetMetaData: OleVariant;
  108. begin
  109.   CheckProvider;
  110.   Result := FProvider.GetMetaData;
  111. end;
  112.  
  113. function TProviderObject.GetRecords(Count: Integer; out RecsOut: Integer): OleVariant;
  114. begin
  115.   CheckProvider;
  116.   Result := FProvider.GetRecords(Count, RecsOut);
  117. end;
  118.  
  119. function TProviderObject.DataRequest(Input: OleVariant): OleVariant;
  120. begin
  121.   CheckProvider;
  122.   Result := FProvider.DataRequest(Input);
  123. end;
  124.  
  125. function TProviderObject.Get_Constraints: WordBool; safecall;
  126. begin
  127.   CheckProvider;
  128.   Result := FProvider.Constraints;
  129. end;
  130.  
  131. procedure TProviderObject.Set_Constraints(Value: WordBool); safecall;
  132. begin
  133.   CheckProvider;
  134.   FProvider.Constraints := Value;
  135. end;
  136.  
  137. procedure TProviderObject.Reset;
  138. begin
  139.   CheckProvider;
  140.   FProvider.Reset;
  141. end;
  142.  
  143. { TCustomProvider }
  144.  
  145. constructor TCustomProvider.Create(AOwner: TComponent);
  146. begin
  147.   inherited Create(AOwner);
  148. end;
  149.  
  150. destructor TCustomProvider.Destroy;
  151. var
  152.   I: Integer;
  153. begin
  154.   if FProviders <> nil then
  155.   begin
  156.     for I := 0 to FProviders.Count - 1 do
  157.       TProviderObject(FProviders[I]).FProvider := nil;
  158.     FProviders.Free;
  159.     FProviders := nil;
  160.   end;
  161.   inherited Destroy;
  162. end;
  163.  
  164. procedure TCustomProvider.AddProvider(AProvider: TProviderObject);
  165. begin
  166.   if FProviders = nil then FProviders := TList.Create;
  167.   FProviders.Add(AProvider);
  168. end;
  169.  
  170. procedure TCustomProvider.RemoveProvider(AProvider: TProviderObject);
  171. begin
  172.   if FProviders <> nil then
  173.   begin
  174.     FProviders.Remove(AProvider);
  175.     if FProviders.Count = 0 then
  176.     begin
  177.       FProviders.Free;
  178.       FProviders := nil;
  179.     end;
  180.   end;
  181. end;
  182.  
  183. function TCustomProvider.GetProvider: IProvider;
  184. begin
  185.   Result := TProviderObject.Create(Self);
  186. end;
  187.  
  188. function TCustomProvider.GetMetaData: OleVariant;
  189. var
  190.   RecsOut: Integer;
  191. begin
  192.   Result := GetRecords(0, RecsOut);
  193. end;
  194.  
  195. function TCustomProvider.Get_Data: OleVariant;
  196. var
  197.   RecsOut: Integer;
  198. begin
  199.   Result := GetRecords(-1, RecsOut);
  200. end;
  201.  
  202. function TCustomProvider.GetRecords(Count: Integer; out RecsOut: Integer): OleVariant;
  203. begin
  204.   Result := NULL;
  205. end;
  206.  
  207. function TCustomProvider.DataRequest(Input: OleVariant): OleVariant;
  208. begin
  209.   Result := NULL;
  210. end;
  211.  
  212. procedure TCustomProvider.Reset;
  213. begin
  214. end;
  215.  
  216. end.
  217.